package ar.com.tristeslos3tigres.radioapp;

import java.util.Calendar;
import java.util.List;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import ar.com.tristeslos3tigres.radioapp.R;
import ar.com.tristeslos3tigres.radioapp.adapters.ProgramacionParserDom;
import ar.com.tristeslos3tigres.radioapp.entities.Programa;

public class MainActivity extends Activity {

	// private static final String TAG = "ar.com.tristeslos3tigres.radioplatinofm.MainActivity";

	private ImageView imgPlayPause;
	private ImageView imgAlarma;
	private ImageView imgLlamada;
	private ImageView imgCompartir;
	private ImageView imgMensaje;
	private ImageView imgNoticias;
	private List<Programa> programas;
	private TextView txt_estas_escuchando;
	Intent serviceIntent;
	private Calendar c = Calendar.getInstance();
	private boolean boolMusicPlaying;
	private boolean isOnline;
	private static final int ALARM_REQUEST_CODE = 1;

	private static final String TELEFONO_RADIO = "03471452171";
	// private static final String URL_STREAMING = "http://radio.solumedia.com.ar:8006"; //contactofm
	private static final String URL_STREAMING = "http://200.58.123.233:5395"; // platino fm

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main_activity);

		// Se pone en false cuando se crea la activity por primera vez
		boolMusicPlaying = false;

		serviceIntent = new Intent(this, RadioStreamingService.class);

		initViews(); // Inicializa views

		setListeners(); // Define los listeners
		// estasEscuchando();

		if (ar.com.tristeslos3tigres.radiostreaming.RadioStreamingService.getIsPlaying()) {
			imgPlayPause.setImageResource(R.drawable.playing_plastic);
			boolMusicPlaying = true;
		} else {
			imgPlayPause.setImageResource(R.drawable.stopped_plastic);
			boolMusicPlaying = false;
		}

		/*
		 * SPC>>** No eliminar, esta para probar la lectura del Rss* try {
		 * FeedConfiguration config = new BlogspotConfiguration();
		 * List<RssFeedItem> aa; try { aa = new RssFeedReaderAsync(config)
		 * .execute( new URL(
		 * "http://contactoradio.blogspot.com/feeds/posts/default")) .get();
		 * 
		 * Log.v(TAG, "Cantidad de noticias recuperadas: " + aa.size()); } catch
		 * (InterruptedException e) { // TODO Auto-generated catch block
		 * e.printStackTrace(); } catch (ExecutionException e) { // TODO
		 * Auto-generated catch block e.printStackTrace(); }
		 * 
		 * String a = "hola"; a = "b"; } catch (MalformedURLException e) { //
		 * TODO Auto-generated catch block e.printStackTrace(); }<<SPC
		 */
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Agrega items al menu de opciones, si esta presente.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	// Inicializa elementos visuales
	private void initViews() {
		imgPlayPause = (ImageView) findViewById(R.id.imgPlayPause);
		imgNoticias = (ImageView) findViewById(R.id.imgNoticias);
		imgAlarma = (ImageView) findViewById(R.id.imgAlarma);
		imgLlamada = (ImageView) findViewById(R.id.imgLlamar);
		imgCompartir = (ImageView) findViewById(R.id.imgCompartir);
		imgMensaje = (ImageView) findViewById(R.id.imgMensaje);
		txt_estas_escuchando = (TextView) findViewById(R.id.txtEstasEscuchando);

	}

	// Define listeners
	private void setListeners() {

		imgPlayPause.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// Animación al pulsar el botón
				v.startAnimation(AnimationUtils.loadAnimation(
						MainActivity.this, R.anim.image_click));
				buttonPlayStopClick();

			}
		});

		imgNoticias.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent();
				intent.setClass(v.getContext(), ListadoNoticiasActivity.class);
				startActivity(intent);
			}
		});

		// btnAlarma.setOnClickListener(new OnClickListener () {
		// @Override
		// public void onClick(View v) {
		// establecerAlarmaClick(5);
		// }
		// });

		imgAlarma.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// Animación al pulsar el botón
				v.startAnimation(AnimationUtils.loadAnimation(
						MainActivity.this, R.anim.image_click));

				new TimePickerDialog(MainActivity.this, t, c
						.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE),
						true).show();
			}
		});

		imgCompartir.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {

				// Animación al pulsar el botón
				v.startAnimation(AnimationUtils.loadAnimation(
						MainActivity.this, R.anim.image_click));

				// Este botón comparte un texto recomendando la aplicación
				// pero no funciona para Facebook. La app de Facebook aparece en
				// el listado
				// de aplicaciones con las que compartir, pero el texto definido
				// no aparece
				// en la nueva publicación que se crea. Para publicar en FB hay
				// que usar
				// el SDK de Facebook para Android.
				Intent shareIntent = new Intent(
						android.content.Intent.ACTION_SEND);
				shareIntent.setType("text/plain");

				shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
						"Escuchá [nombre-programa] desde tu celular");

				String shareMessage = "Estoy escuchando [nombre-programa] desde mi Android. ¡Bajate la aplicación de la radio! [link-google-play]";
				shareIntent.putExtra(android.content.Intent.EXTRA_TEXT,
						shareMessage);

				startActivity(Intent.createChooser(shareIntent, "Compartir"));
			}
		});

		imgLlamada.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// animacion apretar boton
				v.startAnimation(AnimationUtils.loadAnimation(
						MainActivity.this, R.anim.image_click));

				// funcion llamar radio
				try {
					startActivity(new Intent(Intent.ACTION_CALL, Uri
							.parse("tel:" + TELEFONO_RADIO)));
				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		});

		imgMensaje.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {

				// funci�n mandar SMS
				String tel = "03471-15674114";
				String sms = " ";

				Uri uri = Uri.parse("smsto:" + tel);
				Intent it = new Intent(Intent.ACTION_SENDTO, uri);
				it.putExtra("sms_body", sms);
				startActivity(it);
			}
		});

	}

	// Llamado por el listener del boton Play/Stop
	private void buttonPlayStopClick() {
		if (!boolMusicPlaying) {
			imgPlayPause.setImageResource(R.drawable.playing_plastic);
			playAudio();

			boolMusicPlaying = true;
		} else {
			if (boolMusicPlaying) {
				imgPlayPause.setImageResource(R.drawable.stopped_plastic);
				stopMyPlayService();

				boolMusicPlaying = false;
			}
		}
		// if (boolMusicPlaying=false)
		// txt_estas_escuchando.setVisibility(View.INVISIBLE);
	}

	// Detiene servicio de musica
	private void stopMyPlayService() {
		try {
			stopService(serviceIntent);
		} catch (Exception e) {
			e.printStackTrace();
			Toast.makeText(getApplicationContext(),
					e.getClass().getName() + " " + e.getMessage(),
					Toast.LENGTH_LONG).show();
		}
		boolMusicPlaying = false;
	}

	// Inicia servicio de musica
	@SuppressWarnings("deprecation")
	private void playAudio() {

		checkConnectivity();
		if (isOnline) {
			stopMyPlayService();

			// Indicar aqui la url del streaming. (con el 8006 no funcionaba, lo
			// comente y funciono)
			serviceIntent.putExtra("sentAudioLink", URL_STREAMING);

			try {
				startService(serviceIntent);
			} catch (Exception e) {

				e.printStackTrace();
				Toast.makeText(

				getApplicationContext(),

				e.getClass().getName() + " " + e.getMessage(),

				Toast.LENGTH_LONG).show();
			}

		} else {
			AlertDialog alertDialog = new AlertDialog.Builder(this).create();
			alertDialog.setTitle("Sin conexion a Internet");
			alertDialog
					.setMessage("Por favor conectese a alguna red y vuelva a intentarlo");
			alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					// here you can add functions
				}
			});
			// alertDialog.setIcon(R.drawable.icon);
			// btnPlayPause.setBackgroundResource(R.drawable.playbuttonsm);
			alertDialog.show();
		}
	}

	private void checkConnectivity() {
		ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

		if (cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
				.isConnectedOrConnecting()
				|| cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
						.isConnectedOrConnecting())
			isOnline = true;
		else
			isOnline = false;
	}

	private void estasEscuchando() {

		ProgramacionParserDom saxparser = new ProgramacionParserDom(
				"http://www.fevemplas.com.ar/programacion.xml");

		programas = saxparser.parse();

		Calendar horaActual = Calendar.getInstance();
		int horaSistema = horaActual.get(Calendar.HOUR);
		int dia_sistema = horaActual.get(Calendar.DAY_OF_WEEK);
		int AM_orPM = horaActual.get(Calendar.AM_PM); // 0=AM, 1=PM

		if (programas.size() != 0) {
			boolean band = false;

			while (band == false)
				for (int i = 0; i < programas.size(); i++) {

					String dia_semana_programa = programas.get(i).getDia();
					int hr_desde_programa = Integer.parseInt(programas.get(i)
							.getHora_desde());
					int hr_hasta_programa = Integer.parseInt(programas.get(i)
							.getHora_hasta());
					int am_pm_programa = Integer.parseInt(programas.get(i)
							.getFranja());

					if (dia_sistema == 1) {
						if (dia_semana_programa.equals("domingo")
								&& horaSistema >= hr_desde_programa
								&& horaSistema < hr_hasta_programa
								&& AM_orPM == am_pm_programa) {
							String nombre_programa = programas.get(i)
									.getNombre_programa();
							txt_estas_escuchando.setText("Estas escuchando: "
									+ nombre_programa);
							band = true;
						}
					}
					if (dia_sistema == 7) {
						if (dia_semana_programa.equalsIgnoreCase("sabado")
								&& horaSistema >= hr_desde_programa
								&& horaSistema < hr_hasta_programa
								&& AM_orPM == am_pm_programa) {
							String nombre_programa = programas.get(i)
									.getNombre_programa();
							txt_estas_escuchando.setText("Estas escuchando: "
									+ nombre_programa);
							band = true;
						}

					} else {
						if (dia_semana_programa.equals("semana")
								&& horaSistema >= hr_desde_programa
								&& horaSistema < hr_hasta_programa
								&& AM_orPM == am_pm_programa) {
							String nombre_programa = programas.get(i)
									.getNombre_programa();
							txt_estas_escuchando.setText("Estas escuchando: "
									+ nombre_programa);
							band = true;
						}
					}
				}
		} else
			txt_estas_escuchando.setText("No se encontro programaci�n");
	}

	// funciones alarma modo sleep
	private void establecerAlarmaClick(int horaElegida, int minElegida) {
		AlarmManager manager = (AlarmManager) this
				.getSystemService(Context.ALARM_SERVICE);

		// (Modo no acoplado con un componente, ver AndroidManifest.xml)
		Toast toast = Toast.makeText(getApplicationContext(),
				"Se apagara a las: " + horaElegida + ":" + minElegida,
				Toast.LENGTH_SHORT);
		toast.show();

		Calendar horaActual = Calendar.getInstance();
		int horaSistema = horaActual.get(Calendar.HOUR);
		int minutosSistema = horaActual.get(Calendar.MINUTE);

		if (horaElegida < horaSistema)
			horaElegida += 24;

		int horaApagadoEnMinutos = (horaElegida - horaSistema) * 60;
		int minApagado = minutosSistema - minElegida;
		int tiempoFinalEnSegundos = (minApagado + horaApagadoEnMinutos) * 60;

		Intent intent = new Intent(this, AlarmaActivity.class);
		PendingIntent pIntent = PendingIntent.getBroadcast(this,
				ALARM_REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);

		manager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
				+ tiempoFinalEnSegundos * 1000, pIntent);
	}

	TimePickerDialog.OnTimeSetListener t = new OnTimeSetListener() {

		@Override
		public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
			// TODO Auto-generated method stub
			// display.setText("Choosen time is :" + hourOfDay + ":" + minute);

			establecerAlarmaClick(hourOfDay, minute);

		}
	};

	class AlarmaActivity extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			Toast.makeText(context, "Alarma funciono! Iupi", Toast.LENGTH_LONG)
					.show();

			stopMyPlayService();

		}
	}

	@Override
	protected void onResume() {
		super.onResume();

		// TODO: Recuperar el estado de boolMusicPlaying
	}

	@Override
	protected void onStop() {
		super.onStop();

	}

}
